/**
 * Copyright(c) 2013 Jade Techonologies Co., Ltd.
 *
 * History:
 *   13-4-14 下午4:26 Created by dwzhang
 */
package com.jade.framework.base.util;

import java.util.Iterator;
import java.util.Map;

/**
 * 参数存取抽象接口.
 *
 * @author dwzhang
 * @version 1.0 13-4-14 下午4:26
 */
public interface Parameters extends Cloneable
{
//    /** 字符串型参数找不到返回的默认值 */
//    public static final String DEFAULT_STRING = null;
//
//    /** 默认字节型参数找不到时返回的默认值 */
//    public static final byte DEFAULT_BYTE = 0;
//    /** 默认短整型参数找不到时返回的默认值 */
//    public static final short DEFAULT_SHORT = 0;
//    /** 整数型参数找不到返回的默认值 */
//    public static final int DEFAULT_INT = 0;
//    /** 字符类型，默认的字符 */
//    public static final char DEFAULT_CHAR = '\0';
//    /** 布尔型参数找不到返回的默认值 */
//    public static final boolean DEFAULT_BOOLEAN = false;
//    /** 长整型参数找不到返回的默认值 */
//    public static final long DEFAULT_LONG = 0L;
//    /** 浮点型参数找不到返回的默认值 */
//    public static final float DEFAULT_FLOAT = 0.0f;
//    /** 浮点型参数找不到返回的默认值 */
//    public static final double DEFAULT_DOUBLE = 0.0d;
//    /** 对象型参数找不到返回的默认值 */
//    public static final Object DEFAULT_OBJECT = null;

    /**
     * 返回字符型参数
     *
     * @param key 键值
     * @return 如果找不到返回是<code>#DEFAULT_STRING</code>
     */
    public String getString(String key);

    /**
     * 返回字符型参数
     *
     * @param key      键值
     * @param defValue 默认值
     * @return 如果找不到返回是<code>defValue</code>
     */
    public String getString(String key, String defValue);

    /**
     * 返回字节型参数
     *
     * @param key 键值
     * @return 如果找不到返回是<code>#DEFAULT_BYTE</code>
     */
    public byte getByte(String key);

    /**
     * 返回字节型参数
     *
     * @param key      键值
     * @param defValue 默认值
     * @return 如果找不到返回是<code>defValue</code>
     */
    public byte getByte(String key, byte defValue);

    /**
     * 返回字符型参数
     *
     * @param key 键值
     * @return 如果找不到返回是<code>#DEFAULT_BYTE</code>
     */
    public char getChar(String key);

    /**
     * 返回字符型参数
     *
     * @param key      键值
     * @param defValue 默认值
     * @return 如果找不到返回是<code>defValue</code>
     */
    public char getChar(String key, char defValue);

    /**
     * 返回布尔型参数
     *
     * @param key 键值
     * @return 如果找不到返回是<code>#DEFAULT_BOOLEAN</code>
     */
    public boolean getBoolean(String key);

    /**
     * 返回布尔型参数
     *
     * @param key      键值
     * @param defValue 默认值
     * @return 如果找不到返回是<code>defValue</code>
     */
    public boolean getBoolean(String key, boolean defValue);

    /**
     * 返回短整数型参数
     *
     * @param key 键值
     * @return 如果找不到返回是<code>#DEFAULT_SHORT</code>
     */
    public short getShort(String key);

    /**
     * 返回短整数型参数
     *
     * @param key      键值
     * @param defValue 默认值
     * @return 如果找不到返回是<code>defValue</code>
     */
    public short getShort(String key, short defValue);

    /**
     * 返回整数型参数
     *
     * @param key 键值
     * @return 如果找不到返回是<code>#DEFAULT_INT</code>
     */
    public int getInt(String key);

    /**
     * 返回整数型参数
     *
     * @param key      键值
     * @param defValue 默认值
     * @return 如果找不到返回是<code>defValue</code>
     */
    public int getInt(String key, int defValue);


    /**
     * 返回浮点数参数
     *
     * @param key 键值
     * @return 如果找不到返回是<code>#DEFAULT_FLOAT</code>
     */
    public float getFloat(String key);

    /**
     * 返回浮点数参数
     *
     * @param key      键值
     * @param defValue 默认值
     * @return 如果找不到返回是<code>defValue</code>
     */
    public float getFloat(String key, float defValue);

    /**
     * 返回高精度浮点数参数
     *
     * @param key 键值
     * @return 如果找不到返回是<code>#DEFAULT_DOUBLE</code>
     */
    public double getDouble(String key);

    /**
     * 返回高精度浮点数参数
     *
     * @param key      键值
     * @param defValue 默认值
     * @return 如果找不到返回是<code>defValue</code>
     */
    public double getDouble(String key, double defValue);

    /**
     * 返回长整型参数
     *
     * @param key 键值
     * @return 如果找不到返回是<code>#DEFAULT_LONG</code>
     */
    public long getLong(String key);

    /**
     * 返回长整型参数
     *
     * @param key      键值
     * @param defValue 默认值
     * @return 如果找不到返回是<code>defValue</code>
     */
    public long getLong(String key, long defValue);

    /**
     * 返回对象型参数
     *
     * @param key 键值
     * @return 如果找不到返回是<code>#DEFAULT_OBJECT</code>
     */
    public Object getObject(String key);

    /**
     * 返回对象型参数
     *
     * @param key      键值
     * @param defValue 默认值
     * @return 如果找不到返回是<code>defValue</code>
     */
    public Object getObject(String key, Object defValue);

    /**
     * 设字节型参数
     *
     * @param key   键值
     * @param value 字节型
     */
    public void setByte(String key, byte value);

    /**
     * 设字符型参数
     *
     * @param key   键值
     * @param value 字节型
     */
    public void setChar(String key, char value);


    /**
     * 设置短整型的参数
     *
     * @param key   键值
     * @param value 短整型数值
     */
    public void setShort(String key, short value);

    /**
     * 设置整型的参数
     *
     * @param key   键值
     * @param value 整数型数值
     */
    public void setInt(String key, int value);

    /**
     * 设置布尔型参数
     *
     * @param key   键值
     * @param value 布尔型
     */
    public void setBoolean(String key, boolean value);

    /**
     * 设置长整型参数
     *
     * @param key   键值
     * @param value 长整型
     */
    public void setLong(String key, long value);

    /**
     * 设置浮点型参数
     *
     * @param key   键值
     * @param value 浮点型
     */
    public void setFloat(String key, float value);

    /**
     * 设置高精度浮点型参数
     *
     * @param key   键值
     * @param value 高精度浮点型
     */
    public void setDouble(String key, double value);


    /**
     * 设置字符型参数
     *
     * @param key   键值
     * @param value 字符串型
     */
    public String setString(String key, String value);

    /**
     * 设置对象型参数
     *
     * @param key   键值
     * @param value 对象型
     */
    public Object setObject(String key, Object value);

    /**
     * 返回所有的参数名称
     *
     * @return 参数名称枚举
     */
    public abstract Iterator<String> getNames();

    /**
     * 返回各种数据类型对象
     *
     * @return 对象枚举
     */
    public abstract Iterator getValues();

    /**
     * 删除参数
     *
     * @param name 删除参数
     * @return 如果存在该名称的参数，返回删除的参数；否则返回<code>null</code>
     */
    public Object remove(String name);

    /**
     * 添加Parameters
     *
     * @param param 参数集合
     */
    public void putAll(Parameters param);

    /**
     * insert a whole map
     *
     * @param map map
     */
    public void putAll(Map<String, ?> map);

    /** 是否为空 */
    public boolean isEmpty();

    /** 数目 */
    public int size();

    /** 清除所有的参数 */
    public void clear();

    //Array

    /**
     * 返回布尔型数组
     *
     * @param key 键值
     * @return 如果找不到返回是<code>#DEFAULT_BOOLEAN_ARRAY</code>
     */
    public boolean[] getBooleanArray(String key);

    /**
     * 返回布尔型数组
     *
     * @param key      键值
     * @param defValue 默认值
     * @return 布尔型数组
     */
    public boolean[] getBooleanArray(String key, boolean[] defValue);

    /**
     * 返回字节型数组
     *
     * @param key 键值
     * @return 如果找不到返回是<code>#DEFAULT_BYTE_ARRAY</code>
     */
    public byte[] getByteArray(String key);

    /**
     * 返回字节型数组
     *
     * @param key      键值
     * @param defValue 默认值
     * @return 字节型数组
     */
    public byte[] getByteArray(String key, byte[] defValue);

    /**
     * 返回字符型数组
     *
     * @param key 键值
     * @return 如果找不到返回是<code>#DEFAULT_BYTE_ARRAY</code>
     */
    public char[] getCharArray(String key);

    /**
     * 返回字符型数组
     *
     * @param key      键值
     * @param defValue 默认值
     * @return 字节型数组
     */
    public char[] getCharArray(String key, char[] defValue);

    /**
     * 返回高精度浮点型数组
     *
     * @param key 键值
     * @return 如果找不到返回是<code>#DEFAULT_DOUBLE_ARRAY</code>
     */
    public double[] getDoubleArray(String key);

    /**
     * 返回高精度浮点型数组
     *
     * @param key      键值
     * @param defValue 默认值
     * @return 高精度浮点型数组
     */
    public double[] getDoubleArray(String key, double[] defValue);

    /**
     * 返回浮点型数组
     *
     * @param key 键值
     * @return 如果找不到返回是<code>#DEFAULT_FLOAT_ARRAY</code>
     */
    public float[] getFloatArray(String key);

    /**
     * 返回浮点型数组
     *
     * @param key      键值
     * @param defValue 默认值
     * @return 浮点型数组
     */
    public float[] getFloatArray(String key, float[] defValue);

    /**
     * 返回整数型数组
     *
     * @param key 键值
     * @return 如果找不到返回是<code>#DEFAULT_INT_ARRAY</code>
     */
    public int[] getIntArray(String key);

    /**
     * 返回整型数组
     *
     * @param key      键值
     * @param defValue 默认值
     * @return 整型数组
     */
    public int[] getIntArray(String key, int[] defValue);

    /**
     * 返回长整型数组
     *
     * @param key 键值
     * @return 如果找不到返回是<code>#DEFAULT_LONG_ARRAY</code>
     */
    public long[] getLongArray(String key);

    /**
     * 返回长整型数组
     *
     * @param key      键值
     * @param defValue 默认值
     * @return 长整型数组
     */
    public long[] getLongArray(String key, long[] defValue);

    /**
     * 返回对象数组
     *
     * @param key 键值
     * @return 对象数组，如果找不到返回<code>null</code>
     */
    public Object[] getObjectArray(String key);

    /**
     * 返回对象数组
     *
     * @param key      键值
     * @param defValue 默认值
     */
    public Object[] getObjectArray(String key, Object[] defValue);

    /**
     * 返回短整型数组
     *
     * @return 如果找不到返回是<code>#DEFAULT_SHORT_ARRAY</code>
     */
    public short[] getShortArray(String key);

    /**
     * 返回短整型数组
     *
     * @param key      键值
     * @param defValue 默认值
     * @return 短整型数组
     */
    public short[] getShortArray(String key, short[] defValue);

    /**
     * 返回字符型数组
     *
     * @param key 键值
     * @return 如果找不到返回是<code>#DEFAULT_STRING_ARRAY</code>
     */
    public String[] getStringArray(String key);

    /**
     * 返回字符型数组
     *
     * @param key      键值
     * @param defValue 默认值
     */
    public String[] getStringArray(String key, String[] defValue);
}
